package org.jivesoftware.smack.provider;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.jivesoftware.smack.packet.IQ;

public class ProviderManager
{
  private static ProviderManager instance;
  private Map<String, Object> extensionProviders = new ConcurrentHashMap();
  private Map<String, Object> iqProviders = new ConcurrentHashMap();

  private ProviderManager()
  {
    initialize();
  }

  private ClassLoader[] getClassLoaders()
  {
    ClassLoader[] arrayOfClassLoader = new ClassLoader[2];
    arrayOfClassLoader[0] = ProviderManager.class.getClassLoader();
    arrayOfClassLoader[1] = Thread.currentThread().getContextClassLoader();
    ArrayList localArrayList = new ArrayList();
    int i = arrayOfClassLoader.length;
    int j = 0;
    while (true)
    {
      if (j >= i)
        return ((ClassLoader[])localArrayList.toArray(new ClassLoader[localArrayList.size()]));
      ClassLoader localClassLoader = arrayOfClassLoader[j];
      if (localClassLoader != null)
        localArrayList.add(localClassLoader);
      ++j;
    }
  }

  /**
   * @deprecated
   */
  public static ProviderManager getInstance()
  {
    monitorenter;
    try
    {
      if (instance == null)
        instance = new ProviderManager();
      ProviderManager localProviderManager = instance;
      monitorexit;
      return localProviderManager;
    }
    finally
    {
      localObject = finally;
      monitorexit;
      throw localObject;
    }
  }

  private String getProviderKey(String paramString1, String paramString2)
  {
    StringBuilder localStringBuilder = new StringBuilder();
    localStringBuilder.append("<").append(paramString1).append("/><").append(paramString2).append("/>");
    return localStringBuilder.toString();
  }

  /**
   * @deprecated
   */
  public static void setInstance(ProviderManager paramProviderManager)
  {
    monitorenter;
    try
    {
      throw new IllegalStateException("ProviderManager singleton already set");
    }
    finally
    {
      monitorexit;
      throw localObject;
      instance = paramProviderManager;
      monitorexit;
    }
  }

  public void addExtensionProvider(String paramString1, String paramString2, Object paramObject)
  {
    if ((!(paramObject instanceof PacketExtensionProvider)) && (!(paramObject instanceof Class)))
      throw new IllegalArgumentException("Provider must be a PacketExtensionProvider or a Class instance.");
    String str = getProviderKey(paramString1, paramString2);
    this.extensionProviders.put(str, paramObject);
  }

  public void addIQProvider(String paramString1, String paramString2, Object paramObject)
  {
    if ((!(paramObject instanceof IQProvider)) && (((!(paramObject instanceof Class)) || (!(IQ.class.isAssignableFrom((Class)paramObject))))))
      throw new IllegalArgumentException("Provider must be an IQProvider or a Class instance.");
    String str = getProviderKey(paramString1, paramString2);
    this.iqProviders.put(str, paramObject);
  }

  public Object getExtensionProvider(String paramString1, String paramString2)
  {
    String str = getProviderKey(paramString1, paramString2);
    return this.extensionProviders.get(str);
  }

  public Collection<Object> getExtensionProviders()
  {
    return Collections.unmodifiableCollection(this.extensionProviders.values());
  }

  public Object getIQProvider(String paramString1, String paramString2)
  {
    String str = getProviderKey(paramString1, paramString2);
    return this.iqProviders.get(str);
  }

  public Collection<Object> getIQProviders()
  {
    return Collections.unmodifiableCollection(this.iqProviders.values());
  }

  // ERROR //
  protected void initialize()
  {
    // Byte code:
    //   0: aload_0
    //   1: invokespecial 148	org/jivesoftware/smack/provider/ProviderManager:getClassLoaders	()[Ljava/lang/ClassLoader;
    //   4: astore_2
    //   5: aload_2
    //   6: arraylength
    //   7: istore_3
    //   8: iconst_0
    //   9: istore 4
    //   11: goto +532 -> 543
    //   14: aload_2
    //   15: iload 4
    //   17: aaload
    //   18: ldc 150
    //   20: invokevirtual 154	java/lang/ClassLoader:getResources	(Ljava/lang/String;)Ljava/util/Enumeration;
    //   23: astore 5
    //   25: aload 5
    //   27: invokeinterface 160 1 0
    //   32: ifne +9 -> 41
    //   35: iinc 4 1
    //   38: goto +505 -> 543
    //   41: aload 5
    //   43: invokeinterface 164 1 0
    //   48: checkcast 166	java/net/URL
    //   51: astore 6
    //   53: aconst_null
    //   54: astore 7
    //   56: aload 6
    //   58: invokevirtual 170	java/net/URL:openStream	()Ljava/io/InputStream;
    //   61: astore 7
    //   63: invokestatic 176	org/xmlpull/v1/XmlPullParserFactory:newInstance	()Lorg/xmlpull/v1/XmlPullParserFactory;
    //   66: invokevirtual 180	org/xmlpull/v1/XmlPullParserFactory:newPullParser	()Lorg/xmlpull/v1/XmlPullParser;
    //   69: astore 10
    //   71: aload 10
    //   73: ldc 182
    //   75: iconst_1
    //   76: invokeinterface 188 3 0
    //   81: aload 10
    //   83: aload 7
    //   85: ldc 190
    //   87: invokeinterface 194 3 0
    //   92: aload 10
    //   94: invokeinterface 197 1 0
    //   99: istore 11
    //   101: iload 11
    //   103: iconst_2
    //   104: if_icmpne +155 -> 259
    //   107: aload 10
    //   109: invokeinterface 200 1 0
    //   114: ldc 202
    //   116: invokevirtual 207	java/lang/String:equals	(Ljava/lang/Object;)Z
    //   119: ifeq +227 -> 346
    //   122: aload 10
    //   124: invokeinterface 210 1 0
    //   129: pop
    //   130: aload 10
    //   132: invokeinterface 210 1 0
    //   137: pop
    //   138: aload 10
    //   140: invokeinterface 213 1 0
    //   145: astore 31
    //   147: aload 10
    //   149: invokeinterface 210 1 0
    //   154: pop
    //   155: aload 10
    //   157: invokeinterface 210 1 0
    //   162: pop
    //   163: aload 10
    //   165: invokeinterface 213 1 0
    //   170: astore 34
    //   172: aload 10
    //   174: invokeinterface 210 1 0
    //   179: pop
    //   180: aload 10
    //   182: invokeinterface 210 1 0
    //   187: pop
    //   188: aload 10
    //   190: invokeinterface 213 1 0
    //   195: astore 37
    //   197: aload_0
    //   198: aload 31
    //   200: aload 34
    //   202: invokespecial 106	org/jivesoftware/smack/provider/ProviderManager:getProviderKey	(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //   205: astore 38
    //   207: aload_0
    //   208: getfield 21	org/jivesoftware/smack/provider/ProviderManager:iqProviders	Ljava/util/Map;
    //   211: aload 38
    //   213: invokeinterface 216 2 0
    //   218: istore 39
    //   220: iload 39
    //   222: ifne +37 -> 259
    //   225: aload 37
    //   227: invokestatic 220	java/lang/Class:forName	(Ljava/lang/String;)Ljava/lang/Class;
    //   230: astore 41
    //   232: ldc 115
    //   234: aload 41
    //   236: invokevirtual 121	java/lang/Class:isAssignableFrom	(Ljava/lang/Class;)Z
    //   239: ifeq +52 -> 291
    //   242: aload_0
    //   243: getfield 21	org/jivesoftware/smack/provider/ProviderManager:iqProviders	Ljava/util/Map;
    //   246: aload 38
    //   248: aload 41
    //   250: invokevirtual 222	java/lang/Class:newInstance	()Ljava/lang/Object;
    //   253: invokeinterface 112 3 0
    //   258: pop
    //   259: aload 10
    //   261: invokeinterface 210 1 0
    //   266: istore 12
    //   268: iload 12
    //   270: istore 11
    //   272: iload 11
    //   274: iconst_1
    //   275: if_icmpne -174 -> 101
    //   278: aload 7
    //   280: invokevirtual 227	java/io/InputStream:close	()V
    //   283: goto -258 -> 25
    //   286: astore 13
    //   288: goto -263 -> 25
    //   291: ldc 117
    //   293: aload 41
    //   295: invokevirtual 121	java/lang/Class:isAssignableFrom	(Ljava/lang/Class;)Z
    //   298: ifeq -39 -> 259
    //   301: aload_0
    //   302: getfield 21	org/jivesoftware/smack/provider/ProviderManager:iqProviders	Ljava/util/Map;
    //   305: aload 38
    //   307: aload 41
    //   309: invokeinterface 112 3 0
    //   314: pop
    //   315: goto -56 -> 259
    //   318: astore 40
    //   320: aload 40
    //   322: invokevirtual 230	java/lang/ClassNotFoundException:printStackTrace	()V
    //   325: goto -66 -> 259
    //   328: astore 8
    //   330: aload 7
    //   332: invokevirtual 227	java/io/InputStream:close	()V
    //   335: aload 8
    //   337: athrow
    //   338: astore_1
    //   339: aload_1
    //   340: invokevirtual 231	java/lang/Exception:printStackTrace	()V
    //   343: goto +206 -> 549
    //   346: aload 10
    //   348: invokeinterface 200 1 0
    //   353: ldc 233
    //   355: invokevirtual 207	java/lang/String:equals	(Ljava/lang/Object;)Z
    //   358: ifeq -99 -> 259
    //   361: aload 10
    //   363: invokeinterface 210 1 0
    //   368: pop
    //   369: aload 10
    //   371: invokeinterface 210 1 0
    //   376: pop
    //   377: aload 10
    //   379: invokeinterface 213 1 0
    //   384: astore 16
    //   386: aload 10
    //   388: invokeinterface 210 1 0
    //   393: pop
    //   394: aload 10
    //   396: invokeinterface 210 1 0
    //   401: pop
    //   402: aload 10
    //   404: invokeinterface 213 1 0
    //   409: astore 19
    //   411: aload 10
    //   413: invokeinterface 210 1 0
    //   418: pop
    //   419: aload 10
    //   421: invokeinterface 210 1 0
    //   426: pop
    //   427: aload 10
    //   429: invokeinterface 213 1 0
    //   434: astore 22
    //   436: aload_0
    //   437: aload 16
    //   439: aload 19
    //   441: invokespecial 106	org/jivesoftware/smack/provider/ProviderManager:getProviderKey	(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
    //   444: astore 23
    //   446: aload_0
    //   447: getfield 19	org/jivesoftware/smack/provider/ProviderManager:extensionProviders	Ljava/util/Map;
    //   450: aload 23
    //   452: invokeinterface 216 2 0
    //   457: istore 24
    //   459: iload 24
    //   461: ifne -202 -> 259
    //   464: aload 22
    //   466: invokestatic 220	java/lang/Class:forName	(Ljava/lang/String;)Ljava/lang/Class;
    //   469: astore 26
    //   471: ldc 99
    //   473: aload 26
    //   475: invokevirtual 121	java/lang/Class:isAssignableFrom	(Ljava/lang/Class;)Z
    //   478: ifeq +33 -> 511
    //   481: aload_0
    //   482: getfield 19	org/jivesoftware/smack/provider/ProviderManager:extensionProviders	Ljava/util/Map;
    //   485: aload 23
    //   487: aload 26
    //   489: invokevirtual 222	java/lang/Class:newInstance	()Ljava/lang/Object;
    //   492: invokeinterface 112 3 0
    //   497: pop
    //   498: goto -239 -> 259
    //   501: astore 25
    //   503: aload 25
    //   505: invokevirtual 230	java/lang/ClassNotFoundException:printStackTrace	()V
    //   508: goto -249 -> 259
    //   511: ldc 235
    //   513: aload 26
    //   515: invokevirtual 121	java/lang/Class:isAssignableFrom	(Ljava/lang/Class;)Z
    //   518: ifeq -259 -> 259
    //   521: aload_0
    //   522: getfield 19	org/jivesoftware/smack/provider/ProviderManager:extensionProviders	Ljava/util/Map;
    //   525: aload 23
    //   527: aload 26
    //   529: invokeinterface 112 3 0
    //   534: pop
    //   535: goto -276 -> 259
    //   538: astore 9
    //   540: goto -205 -> 335
    //   543: iload 4
    //   545: iload_3
    //   546: if_icmplt -532 -> 14
    //   549: return
    //
    // Exception table:
    //   from	to	target	type
    //   278	283	286	java/lang/Exception
    //   225	259	318	java/lang/ClassNotFoundException
    //   291	315	318	java/lang/ClassNotFoundException
    //   56	220	328	finally
    //   225	259	328	finally
    //   259	268	328	finally
    //   291	315	328	finally
    //   320	325	328	finally
    //   346	459	328	finally
    //   464	498	328	finally
    //   503	508	328	finally
    //   511	535	328	finally
    //   0	53	338	java/lang/Exception
    //   335	338	338	java/lang/Exception
    //   464	498	501	java/lang/ClassNotFoundException
    //   511	535	501	java/lang/ClassNotFoundException
    //   330	335	538	java/lang/Exception
  }

  public void removeExtensionProvider(String paramString1, String paramString2)
  {
    String str = getProviderKey(paramString1, paramString2);
    this.extensionProviders.remove(str);
  }

  public void removeIQProvider(String paramString1, String paramString2)
  {
    String str = getProviderKey(paramString1, paramString2);
    this.iqProviders.remove(str);
  }
}